#pragma once

#include <pthread.h>
#include <iostream>

class ShmCond;  // 前向声明

// 适用于共享内存的锁
class ShmMutex
{
public:
    // 构造函数
    ShmMutex() {
        // 初始化一个可以在进程间使用的锁
        pthread_mutexattr_t mutex_attr;
        pthread_mutexattr_init(&mutex_attr);  // 初始化互斥锁属性对象
        pthread_mutexattr_setpshared(&mutex_attr, PTHREAD_PROCESS_SHARED); // 设置互斥锁为进程间共享
        pthread_mutex_init(&_mtx, &mutex_attr);  // 初始化互斥锁
        pthread_mutexattr_destroy(&mutex_attr);  // 销毁互斥锁属性对象
    }

    // 析构函数
    ~ShmMutex() {
        pthread_mutex_destroy(&_mtx);  // 销毁互斥锁
    }

    // 加锁
    void Lock() {
        pthread_mutex_lock(&_mtx);  // 加锁
    }

    // 解锁
    void UnLock() {
        pthread_mutex_unlock(&_mtx);  // 解锁
    }

private:
    pthread_mutex_t _mtx;  // 互斥锁

    friend class ShmCond;  // 将 ShmCond 声明为友元类
};